import tkinter as tk
from tkinter import Canvas
import random
import math

# 矩形大小
w = 300
h = 200
# 半径
r = 50

def rand(size):
    """
    随机落点函数，计算落在椭圆形区域内的点的比例
    :param size: 随机点的数量
    :return: 椭圆形与矩形的面积比
    """
    arc = 0  # 椭圆形区域
    for i in range(size):
        # 随机数必须在矩形区域内
        x = random.randint(0, w - 1)
        y = random.randint(0, h - 1)
        # 检查点是否在椭圆内
        if is_point_in_ellipse(x, y, w / 2, h / 2, w / 2, h / 2):
            arc += 1
    # 返回计算结果（椭圆形与矩形的面积比）
    return arc / size

def is_point_in_ellipse(x, y, center_x, center_y, radius_x, radius_y):
    """
    判断点是否在椭圆内
    :param x: 点的 x 坐标
    :param y: 点的 y 坐标
    :param center_x: 椭圆中心的 x 坐标
    :param center_y: 椭圆中心的 y 坐标
    :param radius_x: 椭圆的 x 半径
    :param radius_y: 椭圆的 y 半径
    :return: 点是否在椭圆内
    """
    return ((x - center_x) ** 2 / (radius_x ** 2) + (y - center_y) ** 2 / (radius_y ** 2)) <= 1

def calculate_area():
    # 统计 10 次
    len_count = 10
    # 每次随机 100 点
    size = 100
    count = []
    for j in range(len_count):
        count.append(rand(size))
    # 平均数
    sum_count = sum(count)
    ave = sum_count / len_count
    # 利用概率进行椭圆形面积计算
    result_text = f"已知椭圆形与矩形的面积比为：{ave}\n"
    result_text += f"如果矩形面积为：{w}×{h}={w * h}\n"
    result_text += f"那么椭圆形面积为：{w * h * ave}"
    result_label.config(text=result_text)
    # 椭圆形面积公式 π × 半径 a × 半径 b，半径 a=w/2,半径 b=h/2
    print(f"椭圆形真实面积 {math.pi * (w / 2) * (h / 2)}")

# 创建主窗口
root = tk.Tk()
root.title("通过概率计算面积")

# 创建画布
canvas = Canvas(root, width=w, height=h)
canvas.pack()

# 绘制矩形（默认黑色）
canvas.create_rectangle(0, 0, w, h, fill="black")
# 绘制内切椭圆形（白色）
canvas.create_oval(0, 0, w, h, fill="white")

# 创建结果显示标签
result_label = tk.Label(root, text="")
result_label.pack()

# 计算按钮
calculate_button = tk.Button(root, text="计算面积", command=calculate_area)
calculate_button.pack()

# 运行主循环
root.mainloop()